/**
 * @file iic_soft.c
 * @author WaterFairy (995637517@qq.com)
 * @brief
 * @version 1.0.0
 * @date 2022-06-24 21:06:79
 *
 * 0.96寸 OLED显示屏
 * 0x78 0x7A
 * 1.128*64 分辨率
 * 分为8页 每页宽128bit 高8bit
 * 2.
 *
 *
 * @copyright Copyright (c) 2022
 *
 */

#include <wiringPi.h>
#include <stdint.h>
#include <stdio.h>
#include "iic_soft.h"

 // #define SET_DELAY
void  delay_us(unsigned int x) {
    unsigned int i = 0;
    for (i = 0; i < x * 1000; i++)
    {

    }
}



/**
 * @brief 初始化
 *
 */
void iic_soft_init(void)
{
    pinMode(SDA, OUTPUT);
    pinMode(SCL, OUTPUT);
    pullUpDnControl(SDA, PUD_UP);
    pullUpDnControl(SCL, PUD_UP);

}
/**
 * @brief 切换 读/写 模式
 *
 * @param mode MODE_OUTPUT MODE_INPUT
 */
void iic_soft_mode(uint8_t mode)
{

    if (mode == MODE_INPUT)
    {
        pinMode(SDA, INPUT);
    }
    else
    {
        pinMode(SDA, OUTPUT);
    }
}

/**
 * @brief 起始信号
 *
 */
void iic_soft_start(void)
{
    iic_soft_mode(MODE_OUTPUT);
    SCL_HIGH;
#ifdef SET_DELAY
    delay_us(5);
#endif
    SDA_LOW;
#ifdef SET_DELAY
    delay_us(5);
#endif
    SCL_LOW;
}

/**
 * @brief 结束信号
 *
 */
void iic_soft_stop(void)
{
    iic_soft_mode(MODE_OUTPUT);
    SDA_LOW;
#ifdef SET_DELAY
    delay_us(5);
#endif
    SCL_HIGH;
#ifdef SET_DELAY
    delay_us(5);
#endif
    SDA_HIGH;
}

/**
 * @brief 读取写应答信号 应答0 ; 非应答1
 *
 */
uint8_t iic_soft_ack(void)
{
    iic_soft_mode(MODE_INPUT);
    uint8_t ack_time = 0;
    SCL_HIGH;
#ifdef SET_DELAY
    delay_us(5);
#endif
    while (digitalRead(SDA))
    {
        // delay_us(5);
        if (ack_time++ > 250)
        {
            printf("a");
            iic_soft_stop();
            return 1;
        }
    }
    SCL_LOW;
#ifdef SET_DELAY
    delay_us(5);
#endif
    return 0;
}

/**
 * @brief 写数据
 *
 * @param byte
 */
void iic_soft_write_byte(uint8_t byte)
{
    iic_soft_mode(MODE_OUTPUT);
    SCL_LOW;
#ifdef SET_DELAY
    delay_us(5);
#endif
    for (uint8_t i = 0; i < 8; i++)
    {
        iic_soft_mode(MODE_OUTPUT);
        // 先写高位
        // byte << i & 1000 000
        if (byte << i & 0x80)
            SDA_HIGH;
        else
            SDA_LOW;
        SCL_HIGH;
#ifdef SET_DELAY
        delay_us(5);
#endif
        SCL_LOW;
#ifdef SET_DELAY
        delay_us(5);
#endif
    }
}

/**
 * @brief 读取数据
 *
 */
uint8_t iic_soft_read_byte(void)
{
    uint8_t byte;
    for (uint8_t i = 0; i < 8; i++)
    {
        iic_soft_mode(MODE_INPUT);
        SCL_HIGH;
#ifdef SET_DELAY
        delay_us(5);
#endif
        byte <<= 1;
        if (digitalRead(SDA))
        {
            byte |= 1;
        }
        else {
            printf("b");
        }
        SCL_LOW;
#ifdef SET_DELAY
        delay_us(5);
#endif
    }
    return byte;
}
